﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Practices.Unity;
using PharmacyBussinesEntities;
using PharmacyService;

namespace PharmacyWeb.Ventas
{
    public partial class frmVenta : System.Web.UI.Page
    {
        [Dependency]
        public ILoteService loteService { get; set; }
        [Dependency]
        public IVentaService ventaService { get; set; }
        [Dependency]
        public IClienteService clienteService { get; set; }

        private const string KEYVENTA = "VENTA";
        protected void Page_Load(object sender, EventArgs e)
        {
            var idVenta = Request.QueryString["id"];
            var accion = Request.QueryString["accion"];

            if (!Page.IsPostBack)
            {
                if (idVenta !=null && accion !=null && accion.Equals("editar"))
                {
                    var id = Int32.Parse(idVenta);

                    var venta = ventaService.GetVentaById(id);
                    BindVenta(venta);
                }else if (accion!=null && accion.Equals("nuevo"))
                {
                    var nuevaVenta = new Venta()
                    {
                        FechaVenta = DateTime.Now
                    };
                    BindVenta(nuevaVenta);
                    ViewState["accion"] = accion;
                }
                
            }
        }

        private void BindVenta(Venta venta)
        {
            txtFecha.Text = venta.FechaVenta.ToShortDateString();

            if (venta.Cliente !=null)
            {
                txtRucDni.Text = venta.Cliente.DNI;
                txtRazonSocial.Text = venta.Cliente.Nombres;
                txtDireccion.Text = venta.Cliente.Direccion;

            }
            
            venta.Total = venta.DetalleVenta.Sum(it => it.Monto);
            
            
            lvDetalleVenta.DataSource = venta.DetalleVenta;
            lvDetalleVenta.DataBind();

            var lblTotal = lvDetalleVenta.FindControl("lblTotal") as Label;

            if (lblTotal != null)
            {
                lblTotal.Text = venta.Total.ToString();
                txtTotal.Text = venta.Total.ToString();
            }
                
            
            Cache.Insert(KEYVENTA, venta);
        }
        public IEnumerable<Lote> GetLotes([Control("txtCriterio")]string criterio)
        {

            return loteService.GetFromLotesByCriterio(criterio);
        }

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("AddProducto"))
            {
                var idLote = Int32.Parse(e.CommandArgument.ToString());

                var lote = loteService.GetFromLoteById(idLote);

                var venta = Cache.Get(KEYVENTA) as Venta;
                

                if (venta !=null)
                {
                    var existe = venta.DetalleVenta.SingleOrDefault(i => i.IdLote.Equals(idLote));
                    

                    if (existe != null)
                    {
                        existe.Cantidad += 1;
                    }
                    else
                    {
                        var item = new DetalleVenta()
                        {
                            IdVenta = venta.Id,
                            IdLote =  lote.Id,
                            Lote = lote,
                            Cantidad = 1,
                            PrecioUnit = lote.PrecioVenta
                            
                        };

                        venta.DetalleVenta.Add(item);
                    }
                    venta.Total = venta.DetalleVenta.Sum(i => i.Monto);
                    BindVenta(venta);
                }
            }
        }

        protected void lvDetalleVenta_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("QuitarDetalle"))
            {
                var idLote = Int32.Parse(e.CommandArgument.ToString());

                var venta = Cache.Get(KEYVENTA) as Venta;

                if (venta != null)
                {
                    var item = venta.DetalleVenta
                        .SingleOrDefault(it => it.IdLote.Equals(idLote));
                    if (item!=null)
                    {
                        venta.DetalleVenta.Remove(item);
                        BindVenta(venta);
                    }
                }
            }else if (e.CommandName.Equals("ActualizarDetalle"))
            {
                var venta = GetVenta();

                foreach (var row in lvDetalleVenta.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("preciounit") as TextBox;

                    venta.DetalleVenta.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    venta.DetalleVenta.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
                }
                BindVenta(venta);
            }
        }

        private Venta GetVenta()
        {
            return Cache.Get(KEYVENTA) as Venta;
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var venta = GetVenta();

            venta.FechaVenta = DateTime.Parse(txtFecha.Text);

            if (venta !=null)
            {
                if (ViewState["accion"].ToString().Equals("nuevo"))
                {
                   
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('VENTA Registrada..!!')", true);
                }
                else if (ViewState["accion"].ToString().Equals("editar"))
                {
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('se actualizo la VENTA..!!')", true);
                }
            }
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            var rucDni = txtRucDni.Text;

            var cliente = clienteService.GetClienteByRucDNI(rucDni);

            var venta = Cache.Get(KEYVENTA) as Venta;

            if (cliente == null)
            {
                //lblMsgCliente.Text = "El cliente no existe !!!";
                txtRucDni.Text = "";
                txtRazonSocial.Text = "";
                txtDireccion.Text = "";

                //venta.Clientes = null;
            }
            else
            {
                venta.IdCliente = cliente.Id;
                venta.Cliente = cliente;

                Cache.Insert(KEYVENTA, venta);

                txtRucDni.Text = cliente.DNI;
                txtRazonSocial.Text = cliente.Nombres;
                txtDireccion.Text = cliente.Direccion;
                //lblMsgCliente.Text = "";
            }
        }

        protected void gridCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            var clietneDNI = gridCliente.SelectedValue.ToString();

            var cliente = clienteService.GetClienteByRucDNI(clietneDNI);

            txtRucDni.Text = cliente.DNI;
            txtRazonSocial.Text = cliente.Nombres;
            txtDireccion.Text = cliente.Direccion;
        }

        protected void obdsClientes_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            e.ObjectInstance = clienteService;
        }

        protected void btnComprobante_Click(object sender, EventArgs e)
        {
            var venta = GetVenta();

            venta.FechaVenta = DateTime.Parse(txtFecha.Text);

            if (venta != null)
            {
                if (ViewState["accion"].ToString().Equals("nuevo"))
                {
                    ventaService.AddVenta(venta);
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Generando Comprobante..!!')", true);
                    Response.Redirect("frmListadoVentas.aspx");
                }
                else if (ViewState["accion"].ToString().Equals("editar"))
                {
                    ventaService.UpdateVenta(venta);
                }
            }
            
        }
    }
}